Gizmo Analytics
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Privacy friendly, cookieless web analytics built MCP-first. "Add analytics to my Next.js app" → an AI agent runs the setup_analytics_for_site tool, picks the right install snippet, edits your layout file, and verifies the script is loading. OAuth onboarding, no API keys to paste.
| Author | sudomichael |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 792 ms |
| Last measured | 2026-10-25 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Gizmo Analytics": {
"url": "https://gizmoanalytics.io/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (36)
summarize_all_sitesread-onlyWorkspace-wide status rollup: fleet totals with % change vs prior period, per-site status, prioritized needs-attention list, top movers, AI-traffic leaders. Best first call for broad 'how is everything doing' questions.
Parameters:
date_range— string — Defaults to last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
rank_sites_by_growthread-onlyRanks sites by signed % visitor change vs the prior period. Sites under 20 visitors in either period are excluded as noise (count in excluded_low_volume).
Parameters:
limit— integer — Max rows. Defaults to 10, capped at 50.direction— string — Filter to growers ('up'), decliners ('down'), or biggest absolute movers either way ('both', default).date_range— string — Defaults to last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
identify_dead_sitesread-onlyFinds abandoned sites: 'never_installed' (tracker likely never added) or 'went_silent' (had traffic, quiet for N+ days). Sorted never_installed first, then longest-silent.
Parameters:
quiet_days— integer — How many days of silence count as 'dead'. Defaults to 7. Anything fresher than this is treated as alive.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
detect_anomaliesread-onlyFlags days with unusual traffic per site via z-score over the range. Sites under 20 total visitors are skipped as low-signal. Omit site_id to scan the whole fleet.
Parameters:
site_id— string — Site UUID from list_sites. Omit for whole workspace.threshold— number — Z-score absolute value above which to flag a day as anomalous. Defaults to 2.5 (~1-in-100). Lower = more sensitive.date_range— string — Defaults to last_14_days for stable mean/stddev.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
explain_traffic_changeread-onlyExplains why traffic on a site changed: overview deltas, top page and referrer gainers/losers vs prior period, anomaly-day callouts, and the daily series to pinpoint the break.
Parameters:
site_id(required) — string — Site UUID from list_sites.date_range— string — Defaults to last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_realtimeread-onlyLive activity over the last 5 minutes: active visitors, pageviews, custom events, latest observed pages and recent actions. Excludes bots. Presence includes reading heartbeats; the feed excludes them. Entry/exit page session filters are unsupported.
Parameters:
filters— arraysite_id— string — Site UUID from list_sites. Omit for whole workspace.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_conversion_reportread-onlyAudit conversion measurement for a site: goal rates with visitor denominators, funnel completion rates, transitions ranked by lost sessions, and warnings for missing tracking, path-based proxies and small samples. Supports custom dates and stacked activity filters (not entry/exit session filters). Does not infer causes from drop-off counts.
Parameters:
site_id(required) — string — Site UUID from list_sites.filters— arraydate_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
setup_analytics_for_siteOne-call install workflow: creates the site and returns the install snippet, the exact file to paste it into (paste_target.file), and next steps. Preferred for any install/add-analytics request. Edit the paste-target file to insert the snippet; don't just print it.
Parameters:
domain(required) — string — Domain to track, apex preferred (e.g. 'acme.com').framework— string — Detect from config files: next.config.*→next, nuxt.config.*→nuxt, svelte.config.*→sveltekit, astro.config.*→astro, remix→remix, vite.config.*→vite, else react or html.event_hint— string — If the user mentioned a specific event to track (e.g. 'signup'), include an example_event snippet for it.
Hints: read-only no · destructive no · idempotent no · open-world yes
list_sitesread-onlyLists every site in the workspace with id, domain, createdAt, and ignored status. Use the returned site.id for other site-scoped tools.
Parameters:
tag— string — Filter to sites with this tag. Omit for all sites.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
create_siteRegisters a domain and returns the install snippet, a privacy_policy reminder, and an optional badge. For a full install workflow prefer setup_analytics_for_site; use this when only the site row is needed. Edit the target file to insert the snippet; don't just print it.
Parameters:
domain(required) — string — Domain to track, apex preferred (e.g. 'acme.com').framework— string — Detect from config files: next.config.*→next, nuxt.config.*→nuxt, svelte.config.*→sveltekit, astro.config.*→astro, remix→remix, vite.config.*→vite, else react or html.
Hints: read-only no · destructive no · idempotent no · open-world yes
get_install_snippetread-onlyRe-fetches the framework-specific install snippet for an existing site — for a switched framework or a snippet never installed. Edit the target file to insert the snippet; don't just print it.
Parameters:
site_id(required) — string — Site UUID from list_sites.framework— string — Detect from config files: next.config.*→next, nuxt.config.*→nuxt, svelte.config.*→sveltekit, astro.config.*→astro, remix→remix, vite.config.*→vite, else react or html.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
verify_installread-onlyFetches the site's homepage and checks for the tracker script. Returns installed:true, installed:false with a reason (usually not deployed yet), or an error when the fetch is blocked (bot protection) — an error doesn't necessarily mean tracking is broken. Report the result honestly.
Parameters:
site_id(required) — string — Site UUID from list_sites.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_badge_snippetread-onlyReturns the "Powered by Gizmo" footer badge as a single anchor tag. Place inline in the existing footer next to the copyright line; don't wrap or restyle it.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_event_tracking_snippetread-onlyReturns the JS snippet for firing a custom event (e.g. window.gizmo("signup", {plan:"pro"})). Requires the tracker already installed. Edit the target file to insert the snippet at the right code path; don't just print it.
Parameters:
event_name(required) — string — Custom event name, 1–64 chars alphanumeric + dot/dash/underscore.properties— object — Key-value props (string/number/boolean), keys [A-Za-z0-9_]{1,64}. Enables breakdown_by_property later.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
add_site_tagsAttaches one or more free-form tags to a site, creating new tags as needed. Pair with filter_sites_by_tag to drill into a group.
Parameters:
site_id(required) — string — Site UUID from list_sites.tags(required) — array — Array of tag names. New tags are created automatically.
Hints: read-only no · destructive no · idempotent no · open-world yes
filter_sites_by_tagread-onlyList sites carrying a tag. Identical to list_sites({tag}).
Parameters:
tag(required) — string — Tag name (free-form string, lowercase recommended).
Hints: read-only yes · destructive no · idempotent yes · open-world yes
create_goalCreates a conversion goal for a site (path-prefix or named custom event). Shows on the site dashboard with conversion count + rate.
Parameters:
site_id(required) — string — Site UUID from list_sites.name(required) — string — Human-readable name for the goal (e.g. 'Signup', 'Purchase').type(required) — string — 'path' matches sessions that visit a URL path prefix; 'event' matches sessions that fire a named custom event.target(required) — string — When type='path', the URL path prefix (e.g. '/thank-you'). When type='event', the event name (e.g. 'signup').
Hints: read-only no · destructive no · idempotent no · open-world yes
list_goalsread-onlyLists every goal for a site with conversion count and rate over the date range. Requires create_goal first if none exist.
Parameters:
site_id(required) — string — Site UUID from list_sites.filters— arraydate_range
Hints: read-only yes · destructive no · idempotent yes · open-world yes
delete_goaldestructiveRemoves a conversion goal and its historical data. Destructive — confirm first.
Parameters:
goal_id(required) — string — Internal goal UUID. Get one from list_goals.
Hints: read-only no · destructive yes · idempotent no · open-world yes
create_funnelCreates an ordered multi-step funnel for a site. A session reaches step N if it matched steps 0..N in the same session (30-min idle gap).
Parameters:
site_id(required) — string — Site UUID from list_sites.name(required) — string — Human-readable name for the funnel (e.g. 'Pricing to signup').steps(required) — array — Ordered steps. A session 'reaches' step N if it matched all of steps 0..N within the same session (30-min idle gap). Min 2, max 10.
Hints: read-only no · destructive no · idempotent no · open-world yes
list_funnelsread-onlyLists every funnel for a site with per-step reached counts and drop-off rate. Requires create_funnel first if none exist.
Parameters:
site_id(required) — string — Site UUID from list_sites.filters— arraydate_range
Hints: read-only yes · destructive no · idempotent yes · open-world yes
delete_funneldestructiveRemoves a funnel by id. Destructive — confirm first.
Parameters:
funnel_id(required) — string — Internal funnel UUID. Get one from list_funnels.
Hints: read-only no · destructive yes · idempotent no · open-world yes
rename_eventdestructiveRenames an event on a site: backfills every past event to the new name, updates any goal/funnel that targets the old name, and — going forward — rewrites the old name to the new one at ingest, so client bundles still sending the old name keep working. Single-hop only (can't chain renames).
Parameters:
site_id(required) — string — Site UUID from list_sites.from_event(required) — string — The event name events are currently arriving as, 1–64 chars alphanumeric + dot/dash/underscore. Can't be 'pageview' or 'engagement'.to_event(required) — string — The corrected event name to rename it to, 1–64 chars alphanumeric + dot/dash/underscore.
Hints: read-only no · destructive yes · idempotent no · open-world yes
list_event_renamesread-onlyLists every configured event rename for a site.
Parameters:
site_id(required) — string — Site UUID from list_sites.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_workspace_overviewread-onlyAggregate metrics across all sites in the workspace: visitors, pageviews, sessions, bounce rate, top sites.
Parameters:
filters— array — AND-joined filters.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_site_trafficread-onlyTraffic metrics for a single site: overview, top pages, top referrers.
Parameters:
site_id(required) — string — Site UUID from list_sites.filters— array — AND-joined filters.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_revenueread-onlyRevenue attributed to traffic from the site's payment provider: totals (revenue, payments, customers, recurring share) plus a first-touch breakdown by one dimension. Amounts are integer cents; empty breakdown key = unattributed.
Parameters:
limit— integer — Default 20, max 200.site_id— string — Site UUID from list_sites. Omit for whole workspace.dimension— string — Breakdown dimension. Defaults to channel.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
connect_payment_providerStep 1 of revenue-attribution setup: creates or fetches a site's payment integration and returns the webhook URL and events to enable. Idempotent. Follow with set_payment_webhook_secret to activate.
Parameters:
site_id(required) — string — Site UUID from list_sites.provider— string — Payment provider. Defaults to stripe.
Hints: read-only no · destructive no · idempotent no · open-world yes
set_payment_api_keyZero-code Stripe revenue setup: saves a read-only restricted API key for an integration from connect_payment_provider, imports the last 90 days of payments, then re-syncs daily.
Parameters:
integration_id(required) — string — Integration id from connect_payment_provider (provider must be stripe).api_key(required) — string — Restricted read-only key, rk_live_… or rk_test_….
Hints: read-only no · destructive no · idempotent no · open-world yes
set_payment_webhook_secretStep 2 of revenue-attribution setup: saves the webhook signing secret for an integration from connect_payment_provider, activating revenue ingestion.
Parameters:
integration_id(required) — string — Integration id from connect_payment_provider.secret(required) — string — The webhook signing secret (Stripe: whsec_…; Lemon Squeezy: the secret you chose; Polar: the endpoint secret).
Hints: read-only no · destructive no · idempotent no · open-world yes
get_top_pagesread-onlyTop page paths by event count, optionally scoped to one site.
Parameters:
limit— integer — Default 20, max 200.filters— array — AND-joined filters.site_id— string — Site UUID from list_sites. Omit for whole workspace.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_top_referrersread-onlyTop referrer hostnames by event count, optionally scoped to one site.
Parameters:
limit— integer — Default 20, max 200.filters— array — AND-joined filters.site_id— string — Site UUID from list_sites. Omit for whole workspace.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_breakdownread-onlyTop-N rows for one built-in dimension (page, referrer, country, region, city, browser, device, language, screen, channel, ai_source, hostname). For custom event properties use breakdown_by_property instead.
Parameters:
dimension(required) — string — Dimension to group by.limit— integer — Default 20, max 200.filters— array — AND-joined filters.site_id— string — Site UUID from list_sites. Omit for whole workspace.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
query_eventsread-onlyQueries raw events. Defaults to the latest 100, max 1000 per call; paginate large analyses via date_range.
Parameters:
limit— integer — Default 100, max 1000.filters— array — AND-joined filters.site_id— string — Site UUID from list_sites. Omit for whole workspace.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.event_name— string — Custom event name, 1–64 chars alphanumeric + dot/dash/underscore.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_time_seriesread-onlyTime-bucketed visitors/pageviews/events, one row per bucket. Bucket auto-resolves to hour for windows ≤48h, day otherwise.
Parameters:
bucket— string — Bucket granularity. Auto-resolves to hour for windows ≤48h, day otherwise. Override to force a specific bucket.filters— array — AND-joined filters.site_id— string — Site UUID from list_sites. Omit for whole workspace.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
breakdown_by_propertyread-onlyTop values for a custom event property (instrumented via get_event_tracking_snippet), with visitor counts. For built-in dimensions use get_breakdown instead.
Parameters:
property(required) — string — Custom event property name, [A-Za-z0-9_.-]{1,64} (e.g. 'plan').limit— integer — Default 20, max 200.site_id— string — Site UUID from list_sites. Omit for whole workspace.date_range— Preset or custom {from,to} range. Default varies by tool, usually last_7_days.event_name— string — Narrow to a single event (e.g. 'signup'). Omit to roll up across every event that has the property.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.